package com.hhwy.framework.configure;

import java.io.IOException;
import java.util.regex.Matcher;

import org.apache.commons.lang3.StringUtils;

import com.hhwy.framework.cache.Cache;
import com.hhwy.framework.common.Constants;
import com.hhwy.framework.common.Parameter;
import com.hhwy.framework.configure.service.SystemConfigure;
/**
 * <b>类 名 称：</b>ConfigHelper <br/>
 * <b>类 描 述：</b>系统配置信息帮助类,提供获取配置信息(配置信息来源于*-config.properties文件)的方法<br/>
 * <b>创 建 人：</b>lihuiming<br/>
 * <b>修 改 人：</b>Administrator<br/>
 * <b>修改时间：</b>2014年8月4日 上午9:45:42<br/>
 * <b>修改备注：</b><br/>
 * @version 1.0.0<br/>
 */
public class ConfigHelper {
	
	static{
		
		refreshConfig();
	}

	private static String staticURL = getConfig("STATIC.FILE.URL");
	private static ThreadLocal<String> baseURL =new ThreadLocal<String>();
	//多语言命名空间
	private static ThreadLocal<String> nameSpace =new ThreadLocal<String>();
	//语言类型
	private static ThreadLocal<String> language =new ThreadLocal<String>();
	static{
		setLanguage(null);
	}
	
	private static String title = getConfig("SYSTEM.TITLE");
	private String basePath = Parameter.getBasePath();

	public static void refreshConfig(){
		
		try {
			new SystemConfigure().init();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static ConfigHelper CONFIGHELPER = null;
	private ConfigHelper(){}

	/**
	 * getInstance(无法获取刷容器后的最新对象，已废弃；请调用com.hhwy.framework.mvc.ServletRefreshAbstract中的getLatestConfigHelper()方法)<br/>
	 * @return 
	 * ConfigHelper
	 * @exception 
	 * @since  1.0.0
	 */
	@Deprecated
	public static ConfigHelper getInstance(){
//			if(CONFIGHELPER==null)//如果是单例会出现baseURL始终为第一次访问时的地址，以及refreshConfig方法无效
		CONFIGHELPER = new ConfigHelper();
		return CONFIGHELPER;
	}
	
	public static void setNameSpace(String nameSpace){
		ConfigHelper.nameSpace.set(nameSpace);
	}
	
//	public static String getText(String key ){
//
//		if (StringUtils.isBlank(key)) {
//			return "";
//		}
//
//		if(StringUtils.isBlank(nameSpace.get())){
//			nameSpace.set(getNameSpaceByServletPath());
//		}
//
//		if(StringUtils.isNotBlank(ConfigHelper.nameSpace.get())){
//			key = nameSpace.get() + "." + key + "_" + language.get();
//		}else{
//			key = key + "_" + language.get();
//		}
//
//		return Cache.getLanguageConfig(key);
//	}
	
	/**
	 * getNameSpaceByServletPath(通过相对路径生成命名空间)<br/>
	 * @return 
	 * String
	 * @exception 
	 * @since  1.0.0
	*/
	private static String getNameSpaceByServletPath() {
		String nameSpace = "";
		if(StringUtils.isNotBlank(Parameter.getServletPath())){
			Matcher matcher = Constants.SERVLET_PATH.matcher(Parameter.getServletPath());
			boolean success = matcher.find();
			if(success){
				String relativePath = matcher.group("relativePath");
				nameSpace = relativePath.substring(1).replaceAll("/", ".");
			}
		}
		return nameSpace;
	}

	public static void setLanguage(String language){
		if(StringUtils.isNotBlank(language)){
			ConfigHelper.language.set(language);
		}else{
			String defaultLanguage = Cache.getSystemConfig("default_language");
			if(StringUtils.isNotBlank(defaultLanguage)){
				ConfigHelper.language.set(defaultLanguage);
			}else{
				ConfigHelper.language.set(Constants.DEFAULT_LANGUAGE);
			}
		}
	}
	
	public static String getLanguage(){
		return ConfigHelper.language.get();
	}
	
	public static String i(String key ){
		return getConfig(key);
	}
	/**
	 * 从缓存中读取**.properties信息
	 * @param key
	 * @return
	 */
	public static String getConfig(String key ){
		
		if (key==null) {
			return null;
		}
		
		return Cache.getSystemConfig(key.toLowerCase());
	}
	
	public String getTitle() {
		return title;
	}

	public String getBaseURL() {
		if(StringUtils.isNotBlank(baseURL.get()))
			return baseURL.get();
		if(StringUtils.isNotBlank(this.basePath))
			return this.basePath;
		return "/";
	}

	public void setBaseURL(String baseURL) {
		ConfigHelper.baseURL.set(baseURL);
	}

	public String getStaticURL() {
		return staticURL;
	}
	
	public String getBasePath() {
		return this.basePath;
	}
	
}
